home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / nt / fioben.zip / CAT6.CPP < prev    next >
C/C++ Source or Header  |  1993-02-09  |  6KB  |  225 lines

  1. #include    <windows.h>
  2. #include    <string.h>
  3. #include    <iostream.h>
  4. #include    <iomanip.h>
  5. #include    <fstream.h>
  6. #include    <string.h>
  7.  
  8. ofstream    CERR("results.out", ios::app);
  9. int    BUFLEN = 0x10000;
  10.  
  11. ostream    & operator << (ostream & os, SYSTEMTIME & r)
  12. {
  13.     static    const char    * const rgszDayNames[] =
  14.         {
  15.         "Sunday",
  16.         "Monday",
  17.         "Tuesday",
  18.         "Wednesday",
  19.         "Thursday",
  20.         "Friday",
  21.         "Saturday",
  22.         0
  23.         };
  24.     char    chFill = os.fill();
  25.     os.fill('0');
  26.     os //--------------------------------- << rgszDayNames[r.wDayOfWeek] << ' '
  27.         << setw(2) << r.wMonth << '/'
  28.         << setw(2) << r.wDay << '/'
  29.         << setw(2) << r.wYear << ' '
  30.         << setw(2) << r.wHour << ':'
  31.         << setw(2) << r.wMinute << ':'
  32.         //------------------- << setw(2) << r.wSecond
  33.         ;
  34.     os.fill(chFill);
  35.     return    os;
  36. }
  37.  
  38. //****************************************************************
  39. void    cat2(HANDLE h, HANDLE hOut)
  40. {
  41.     HANDLE    hOutMap = 0;
  42.     LPVOID    pOut = 0;
  43.     DWORD    dwMapFirst = 0;
  44.     DWORD    dwMapOffset = 0;
  45.     DWORD    dwOutSize = 0;
  46.     //----------------------------------------------------------------
  47.     HANDLE    hMap = CreateFileMapping(h, 0, PAGE_READONLY, 0,0, 0);
  48.     if (0 == hMap)
  49.         {
  50.         CERR << GetLastError() << ": error in CreateFileMapping."
  51.             << "Line " << __LINE__ << ", file " << __FILE__
  52.             << endl;
  53.         return;
  54.         }
  55.     LPVOID    pView = MapViewOfFile(hMap, FILE_MAP_READ, 0,0, 0);
  56.     if (0 == pView)
  57.         {
  58.         CERR << GetLastError() << ": error in MapViewOfFile()."
  59.             << "Line " << __LINE__ << ", file " << __FILE__
  60.             << endl;
  61.         CloseHandle(hMap);
  62.         return;
  63.         }
  64.     DWORD    dwFileSizeHigh, dwFileSizeLo = GetFileSize(h, &dwFileSizeHigh);
  65.     //----------------------------------------------------------------
  66.     DWORD    dwHere = SetFilePointer(hOut, 0, 0, FILE_END);
  67.     if ((DWORD)-1 == dwHere)
  68.         {
  69.         CERR << GetLastError() << ": error getting file pos."
  70.             << "Line " << __LINE__ << ", file " << __FILE__
  71.             << endl;
  72.         goto Cleanup;
  73.         }
  74.     dwOutSize = SetFilePointer(hOut, dwFileSizeLo, 0, FILE_CURRENT);
  75.     if ((DWORD)-1 == dwOutSize)
  76.         {
  77.         CERR << GetLastError() << ": error extending file end."
  78.             << "Line " << __LINE__ << ", file " << __FILE__
  79.             << endl;
  80.         goto Cleanup;
  81.         }
  82.     if (!SetEndOfFile(hOut) )
  83.         {
  84.         CERR << GetLastError() << ": error setting new end of file."
  85.             << "Line " << __LINE__ << ", file " << __FILE__
  86.             << endl;
  87.         goto Cleanup;
  88.         }
  89.     //----------------------------------------------------------------
  90.     dwMapFirst = dwHere & ~(0xffff);
  91.     dwMapOffset = dwHere - dwMapFirst;
  92.  
  93.     hOutMap = CreateFileMapping(hOut, 0, PAGE_READWRITE,
  94.                         0, dwOutSize, 0);
  95.     if (0 == hOutMap)
  96.         {
  97.         CERR << GetLastError() << ": error mapping output file."
  98.             << "Line " << __LINE__ << ", file " << __FILE__
  99.             << endl;
  100.         }
  101.     pOut = MapViewOfFile(hOutMap, FILE_MAP_WRITE, 0, dwMapFirst,
  102.         dwFileSizeLo + dwMapOffset);
  103.     if (0 == pOut)
  104.         {
  105.         CERR << GetLastError() << ": error mapping view of output."
  106.             << "Line " << __LINE__ << ", file " << __FILE__
  107.             << endl;
  108.         goto CleanupWrite;
  109.         }
  110. #if 1
  111.     memcpy((void *)((char *)pOut + dwMapOffset),
  112.         pView, dwFileSizeLo);
  113. #else
  114.     if (!WriteProcessMemory(GetCurrentProcess(),
  115.         (void *)((char *)pOut + dwMapOffset),
  116.         pView, dwFileSizeLo, 0) )
  117.         {
  118.         CERR << GetLastError() << ": error in WriteProcessMemory()."
  119.             << "Line " << __LINE__ << ", file " << __FILE__
  120.             << endl;
  121.         }
  122. #endif
  123.     if (!UnmapViewOfFile(pOut) )
  124.         {
  125.         CERR << GetLastError() << ": error unmapping output."
  126.             << "Line " << __LINE__ << ", file " << __FILE__
  127.             << endl;
  128.         }
  129.     //----------------------------------------------------------------
  130. CleanupWrite:
  131.     CloseHandle(hOutMap);
  132. Cleanup:
  133.     UnmapViewOfFile(pView);
  134.     CloseHandle(hMap);
  135. }
  136. //****************************************************************
  137. void cat(HANDLE h, HANDLE hOut)
  138. {
  139.     char    szBuf[8192];
  140.     DWORD    nBytes;
  141.     while (ReadFile(h, szBuf, sizeof(szBuf), &nBytes, 0) && nBytes)
  142.         {
  143.         DWORD    nWritten;
  144.         if (!WriteFile(hOut, szBuf, nBytes, &nWritten, 0) )
  145.             {
  146.             CERR << GetLastError() << ": error in WriteFile. "
  147.                 << nBytes << " read, " << nWritten << " written."
  148.                 << "Line " << __LINE__ << ", file " << __FILE__
  149.                 << endl;
  150.             // return;
  151.             }
  152.         }
  153. }
  154. //****************************************************************
  155. int main(int argc, char **argv)
  156. {
  157.     if (argc < 2)
  158.         {
  159.         cat(GetStdHandle(STD_INPUT_HANDLE), GetStdHandle(STD_OUTPUT_HANDLE));
  160.         return    0;
  161.         }
  162.     //----------------------------------------------------------------
  163.     SYSTEMTIME    sNow;
  164.     GetLocalTime(&sNow);
  165.     CERR << sNow << "===> " << GetCommandLine() << endl;
  166.     //----------------------------------------------------------------
  167.     HANDLE    hStdout = CreateFile("testme.out",
  168.         GENERIC_READ | GENERIC_WRITE,
  169.         0,
  170.         0,
  171.         CREATE_ALWAYS,
  172.         0,
  173.         0);
  174.     if (INVALID_HANDLE_VALUE == hStdout)
  175.         {
  176.         CERR << GetLastError() << ": error opening testme.out for writing."
  177.             << "Line " << __LINE__ << ", file " << __FILE__
  178.             << endl;
  179.         return    4;
  180.         }
  181.     if (FILE_TYPE_DISK != GetFileType(hStdout) )
  182.         {
  183.         CERR << "Can't use " << argv[0] << " for console i/o."
  184.             << "Line " << __LINE__ << ", file " << __FILE__
  185.             << endl;
  186.         return    2;
  187.         }
  188.     if ((DWORD) -1 == SetFilePointer(hStdout, 0, 0, FILE_BEGIN) )
  189.         {
  190.         CERR << GetLastError() << ": error seeking to beginning of output."
  191.             << endl;
  192.         return    4;
  193.         }
  194.     if (!SetEndOfFile(hStdout))
  195.         {
  196.         CERR    << GetLastError() << ": error truncating output file."
  197.             << endl;
  198.         return    4;
  199.         }
  200.     //----------------------------------------------------------------
  201.     DWORD    dwStart = GetTickCount();
  202.     for (int iArg = 1; iArg < argc; iArg++)
  203.         {
  204.         HANDLE    fp = CreateFile(argv[iArg], GENERIC_READ,
  205.             FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
  206.             OPEN_EXISTING, 0, 0);
  207.         if (INVALID_HANDLE_VALUE == fp)
  208.             {
  209.             CERR << GetLastError() << ": error opening file "
  210.                 << argv[iArg] << " for reading." << endl;
  211.             continue;
  212.             }
  213.  
  214.         cat2(fp, hStdout);
  215.         CloseHandle(fp);
  216.         }
  217.     dwStart = GetTickCount( ) - dwStart;
  218.      CERR << "**** Total time: " << (dwStart / 1000)
  219.         << '.' << (dwStart % 1000) << " seconds."
  220.         << endl;
  221.     return    0;
  222. }
  223.  
  224.  
  225.